/**
 * 购物车模型
 * 用于定义购物车表的结构以及相关操作
 * 
 * 数据库表定义（对应 flower_db_ddl_init.sql 中的 carts 表）：
 * - id: INT UNSIGNED AUTO_INCREMENT COMMENT '主键'
 * - user_id: INT UNSIGNED NOT NULL COMMENT '用户id' (外键 → users.id)
 * - goods_id: INT UNSIGNED NOT NULL COMMENT '商品id' (外键 → goods.id)
 * - quantity: INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '数量'
 * - blessing: VARCHAR(255) COMMENT '祝福语'
 * - is_checked: TINYINT NOT NULL DEFAULT 1 COMMENT '是否选中：1选中 0未选'
 * - created_at: DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)
 * - updated_at: DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
 * 
 * 索引定义：
 * - PRIMARY KEY (id)
 * - UNIQUE KEY uk_carts_user_goods (user_id, goods_id)
 * - KEY idx_carts_goods_id (goods_id)
 * 
 * 外键约束：
 * - CONSTRAINT fk_carts_users_user_id FOREIGN KEY (user_id) REFERENCES users(id)
 * - CONSTRAINT fk_carts_goods_goods_id FOREIGN KEY (goods_id) REFERENCES goods(id)
 */
const { DataTypes } = require('sequelize');
const { sequelize } = require('../config/database');

const Cart = sequelize.define('Cart', {
  // 主键ID，自动递增
  id: {
    type: DataTypes.INTEGER.UNSIGNED,
    autoIncrement: true,
    primaryKey: true,
    field: 'id',
    comment: '主键'
  },
  // 用户ID，关联用户表 (外键：fk_carts_users_user_id → users.id)
  userId: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    field: 'user_id',
    comment: '用户id'
  },
  // 商品ID，关联商品表 (外键：fk_carts_goods_goods_id → goods.id)
  goodsId: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    field: 'goods_id',
    comment: '商品id'
  },
  // 商品数量，不能为空，默认值为1
  quantity: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    defaultValue: 1,
    field: 'quantity',
    comment: '数量'
  },
  // 祝福语，可为空
  blessing: {
    type: DataTypes.STRING(255),
    allowNull: true,
    field: 'blessing',
    comment: '祝福语'
  },
  // 是否选中标识：1表示选中，0表示未选中，默认为1（选中）
  checked: {
    type: DataTypes.TINYINT,
    allowNull: false,
    defaultValue: 1,
    field: 'is_checked',
    comment: '是否选中：1选中 0未选'
  }
}, {
  // 指定数据库中的表名
  tableName: 'carts',
  // 启用时间戳功能，自动管理创建时间和更新时间
  timestamps: true,
  createdAt: 'created_at',
  updatedAt: 'updated_at',
  // 定义表的索引（与数据库DDL完全一致）
  indexes: [
    // 建立唯一索引，确保同一个用户的购物车中不会出现重复的商品
    { name: 'uk_carts_user_goods', fields: ['userId', 'goodsId'], unique: true },
    // 为商品ID建立普通索引
    { name: 'idx_carts_goods_id', fields: ['goodsId'] }
    // 注意：数据库DDL中没有user_id的单独索引
  ]
});

// 添加实例方法以确保字段正确序列化
Cart.prototype.toJSON = function() {
  const values = Object.assign({}, this.get());
  // 移除时间字段
  delete values.created_at;
  delete values.updated_at;
  return values;
};


module.exports = Cart;